/*
 *  $Id: Randomizer.cs 1192 2010-11-13 12:34:12Z thenn.erannor $
 *	This file is a part of Ragima CCG.
 *	(C) 2008-2010 Ragima development group.
 *
 *	Licensed under the terms of the GNU GPL License version 2.
 *
 */

using System;

using jp.takel.PseudoRandom;

namespace Ragima {
    /// <summary>
    /// Класс-обертка над генератором случайных чисел для возможности его замены.
    /// На данный момент используется реализация MersenneTwister, а не систеемный.
    /// </summary>
    public sealed class Randomizer {
        /// <summary>
        /// Глобальный экземпляр генератора случайных чисел.
        /// Используется для тех случаев, где не нужна строго определенная последовательность.
        /// </summary>
        public static Randomizer Global = new Randomizer();

        private Random _random;

        private Randomizer() {
            _random = new MersenneTwister((uint) DateTime.Now.Ticks);
        }
        /// <summary>
        /// Создает экземпляр генератора случайных чисел с указанным номером начала последовательности.
        /// </summary>
        public Randomizer(int seed) {
            _random = new MersenneTwister((uint) seed);
        }

        /// <summary>
        /// Генерирует целое число в полном диапазоне типа <see cref="System.Int32"/>.
        /// </summary>
        public int Next() {
            return _random.Next();
        }

        /// <summary>
        /// Генерирует целое число в диапазоне от 0 до maxValue-1.
        /// </summary>
        public int Next(int maxValue) {
            return _random.Next(maxValue);
        }

        /// <summary>
        /// Генерирует целое число в диапазоне от minValue до maxValue.
        /// </summary>
        public int Next(int minValue, int maxValue) {
            return _random.Next(minValue, maxValue);
        }

        /// <summary>
        /// Генерирует вещественное число в диапазоне от 0 до 1 (не включая 1).
        /// </summary>
        public double NextDouble() {
            return _random.NextDouble();
        }
    }
}